package com.ingenio.siot.adapter;

import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.siot.Adapter;
import com.ingenio.siot.entity.Calle;
import com.ingenio.siot.entity.EstadoTransito;
import com.ingenio.siot.entity.Linea;
import com.ingenio.siot.entity.LineasMasTransitadas;
import com.ingenio.siot.entity.TipoCalle;
import com.ingenio.siot.entity.Top10LineasEstado;
import com.mysql.jdbc.CallableStatement;
import com.mysql.jdbc.Connection;

public class ReportesAdapter extends Adapter{
	
	public List<EstadoTransito> devolverEvolucionCalleCriterio(Integer idCriterio, Integer idAltura, Integer dias){
		Connection conn = null;
		CallableStatement callableStatement = null;
		String storeProc = "{call EvolucionEstadosLinea(?,?,?)}";
		List<EstadoTransito> estados = new ArrayList<EstadoTransito>();
    	try {
			conn = (Connection) abrirConexion();
			callableStatement = (CallableStatement) conn.prepareCall(storeProc);
			callableStatement.setInt(1, idAltura);
			callableStatement.setInt(2, idCriterio);
			callableStatement.setInt(3, dias);
			ResultSet rs = callableStatement.executeQuery();
			EstadoTransito et = null;
			TransitoAdapter ta = new TransitoAdapter();
			CriterioAdapter ca = new CriterioAdapter();
			EstadoAdapter ea = new EstadoAdapter();
			while(rs.next()) {
				Integer idLinea = rs.getInt("IdLinea");
				Integer idEstado = rs.getInt("IdEstado");
				Double formula = rs.getDouble("valorFuncion");
				Timestamp ts = rs.getTimestamp("fechaEstado");
				et = new EstadoTransito(ta.devolverTransito(idLinea, ts), ca.devolverCriterio(idCriterio), ea.devolverEstado(idEstado), formula);
				estados.add(et);
			}
		} 
    	catch (Exception e) {
			e.printStackTrace();
		} 
    	finally {
    		cerrarConexion(conn);
    	}
    	return estados;
	}
	
	public List<LineasMasTransitadas> devolverCallesMasTransitadas(Integer dias){
		Connection conn = null;
		CallableStatement callableStatement = null;
		CalleAdapter ca = new CalleAdapter();
		Calle c = null;
		TipoCalleAdapter tca = new TipoCalleAdapter();
		TipoCalle tc = null;
		LineasMasTransitadas lmt = null;
		List<LineasMasTransitadas> lineasMasTrans = new ArrayList<LineasMasTransitadas>();
		String storeProc = "{call CallesMasTransitadas(?)}";
		ResultSet rs = null;
		try {
			conn = (Connection) abrirConexion();
			callableStatement = (CallableStatement) conn.prepareCall(storeProc);
			callableStatement.setInt(1, dias);
			
			rs = callableStatement.executeQuery();
			while(rs.next()) {
				Integer idCalle = rs.getInt("IdCalle");
				Integer idTipoCalle = rs.getInt("IdTipoCalle");
				String altura = rs.getString("nroAltura");
				Double proporcion = rs.getDouble("proporcion");
				
				c = ca.devolverCalle(idCalle);
				tc = tca.devolverTipoCalle(idTipoCalle);
				
				lmt = new LineasMasTransitadas(c, tc, altura, proporcion);
				lineasMasTrans.add(lmt);				
			}
		} 
    	catch (Exception e) {
			e.printStackTrace();
		} 
    	finally {
    		cerrarConexion(conn);
    	}
    	return lineasMasTrans;
	}

//	public ResultSet devolverTop10LineasPorEstado(Integer dias, Integer idCriterio, Integer idEstado){
//		Connection conn = null;
//		CallableStatement callableStatement = null;
//		String storeProc = "{call Top10LineasPorEstado(?,?,?)}";
//		
//		ResultSet rs = null;
//		try {
//			conn = (Connection) abrirConexion();
//			callableStatement = (CallableStatement) conn.prepareCall(storeProc);
//			callableStatement.setInt(1, dias);
//			callableStatement.setInt(2, idCriterio);
//			callableStatement.setInt(3, idEstado);
//			
//			rs = callableStatement.executeQuery();
////			while(rs.next()) {
////				Integer idLinea = rs.getInt("IdLinea");
////				Double cantidad = rs.getDouble("cantidad");
////				
////			}
//		} 
//    	catch (Exception e) {
//			e.printStackTrace();
//		} 
//    	finally {
//    		cerrarConexion(conn);
//    	}
//    	return rs;
//	}
	
	public List<Top10LineasEstado> devolverTop10LineasPorEstado(Integer dias, Integer idCriterio, Integer idEstado){
		Connection conn = null;
		CallableStatement callableStatement = null;
		Top10LineasEstado top10 = null;
		List<Top10LineasEstado> lineas = new ArrayList<Top10LineasEstado>();
		LineaAdapter la = new LineaAdapter();
		Linea l = null;
		String storeProc = "{call Top10LineasPorEstado(?,?,?)}";
		ResultSet rs = null;
		try {
			conn = (Connection) abrirConexion();
			callableStatement = (CallableStatement) conn.prepareCall(storeProc);
			callableStatement.setInt(1, dias);
			callableStatement.setInt(2, idCriterio);
			callableStatement.setInt(3, idEstado);
			
			rs = callableStatement.executeQuery();
			while(rs.next()) {
				Integer idLinea = rs.getInt("IdLinea");
				Integer cantidad = rs.getInt("cantidad");
				
				l = la.devolverLinea(idLinea);
				top10 = new Top10LineasEstado(l, cantidad);
				
				lineas.add(top10);
			}
		} 
    	catch (Exception e) {
			e.printStackTrace();
		} 
    	finally {
    		cerrarConexion(conn);
    	}
    	return lineas;
	}
	
	public static void main(String args[]) throws Exception {
		ReportesAdapter ra = new ReportesAdapter();
		List<EstadoTransito> estados = ra.devolverEvolucionCalleCriterio(17, 1300, 5);
		System.out.println("Ejecutando reporte");
		for(EstadoTransito et:estados){
			System.out.println(et.getValorFuncion());
		}
 	}
}

